package org.example.spring02aop.proxy.dynamic;

import java.lang.reflect.Proxy;
import java.util.Arrays;
import org.example.spring02aop.log.LogUtils;

/*
* 动态代理：JDK动态代理：强制要求：目标对象必须有接口。代理也只是接口规定的方法
*/
public class DynamicProxy {
    public static Object getProxyInstance(Object target){
       return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                (proxy, method, args) -> {
                     String name =method.getName();
                    Object result=null;
                     //记录开始
                    LogUtils.logStart(name,args);
                    try{
                        result = method.invoke(target, args);
                        //记录返回值
                        LogUtils.logReturn(name,result);
                    }catch(Exception e){
                        LogUtils.logException(name,e);
                    }finally {
                        LogUtils.logEnd(name);
                    }


                    return result;

                }
       );
    }
}
